//==========================================================================
// Copyright (c) 2000-2008,  Elastos, Inc.  All Rights Reserved.
//==========================================================================

#ifndef __ELASTOS_HAL_BITOPS_H__
#define __ELASTOS_HAL_BITOPS_H__

INLINE void SetBit(uint_t uBitNo, volatile byte_t *pb)
{
    ASM(__LOCK
        "btsl %1, %0;"
        :"=m"(*pb) :"Ir"(uBitNo));
}

INLINE void ClearBit(uint_t uBitNo, volatile byte_t *pb)
{
    ASM(__LOCK
        "btrl %1, %0;"
        :"=m"(*pb) :"Ir"(uBitNo));
}

INLINE void ChangeBit(uint_t uBitNo, volatile byte_t *pb)
{
    ASM(__LOCK
        "btcl %1, %0;"
        :"=m"(*pb) :"Ir" (uBitNo));
}

INLINE uint_t TestBit(uint_t uBitNo, volatile byte_t *pb)
{
    uint_t uOldBit;

    ASM(__LOCK
        "btl  %2, %1;"
        "sbbl %0, %0;"
        :"=r"(uOldBit), "=m"(*pb) :"Ir"(uBitNo) :"memory");

    return uOldBit;
}

INLINE uint_t TestAndSetBit(uint_t uBitNo, volatile byte_t *pb)
{
    uint_t uOldBit;

    ASM(__LOCK
        "btsl %2, %1;"
        "sbbl %0, %0;"
        :"=r"(uOldBit), "=m"(*pb) :"Ir"(uBitNo) :"memory");

    return uOldBit;
}

INLINE uint_t TestAndClearBit(uint_t uBitNo, volatile byte_t *pb)
{
    uint_t uOldBit;

    ASM(__LOCK
        "btrl %2, %1;"
        "sbbl %0, %0;"
        :"=r"(uOldBit), "=m"(*pb) :"Ir"(uBitNo) :"memory");

    return uOldBit;
}

INLINE uint_t TestAndChangeBit(uint_t uBitNo, volatile byte_t *pb)
{
    uint_t uOldBit;

    ASM(__LOCK
        "btcl %2, %1;"
        "sbbl %0, %0;"
        :"=r"(uOldBit), "=m"(*pb) :"Ir"(uBitNo) :"memory");

    return uOldBit;
}

#endif // __ELASTOS_HAL_BITOPS_H__
